﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Didsoft.DataAccess.NHibernate;
using Boa.HD.AccesoDatos.Contratos;

namespace Boa.HD.AccesoDatos.Contexto
{
    public class SubePrioridadData : DataAccessBase<object>, ISubePrioridadData 
    {
        public bool SubirPrioridad(int MinutosParaSubirAMuyAlta = 1, int MinutosParaSubirAAlta = 2, int MinutosParaSubirAMedia=3)
        {
            #region sql query

            string sql = @"
                            declare @EstadoTrabajoId int = -1, --  All = -1
                                    @Prioridad int = -1, --  All = -1,
                                    @Filtro varchar(50) = '%',
                            
                                    @MinutosParaSubirAMuyAlta int = :MinutosParaSubirAMuyAlta,  
                                    @MinutosParaSubirAAlta int = :MinutosParaSubirAAlta,
                                    @MinutosParaSubirAMedia int = :MinutosParaSubirAMedia,
                            
                            
                                    @HistoriaId int

                            declare @HistoriaResumen table (HistoriaRaiz int, HistoriaPadre int, HistoriaId int) 

                            DECLARE HistoriasCursor CURSOR
                            FOR 
                            SELECT HistoriaProblemaAsistidoId 
                            from HD_HistoriaProblemaAsistido  hpa
                            inner join HD_AsignacionTecnicoProblema atp on atp.AsignacionTecnicoProblemaId = hpa.AsignacionTecnicoProblemaId
                            inner join HD_Tecnico t on t.TecnicoId = atp.TecnicoId
                            where hpa.HistorialProblemaPadreId is null --and hpa.HistoriaProblemaAsistidoId = @HistoriaId

                            OPEN HistoriasCursor
                            FETCH HistoriasCursor INTO @historiaId	
                            WHILE @@FETCH_STATUS = 0
                            BEGIN
                                    WITH Historial (HistorialProblemaPadreId, HistoriaProblemaAsistidoId)
                                    AS
                                    (
                                          SELECT HistorialProblemaPadreId, HistoriaProblemaAsistidoId
                                            FROM HD_HistoriaProblemaAsistido
                                            WHERE HistoriaProblemaAsistidoId = @historiaId
                                        UNION ALL
                                    --RECURSIVIDAD
                                        SELECT   hpa.HistorialProblemaPadreId, hpa.HistoriaProblemaAsistidoId
                                            FROM HD_HistoriaProblemaAsistido AS hpa
                                            INNER JOIN Historial AS tmp
                                                ON tmp.HistoriaProblemaAsistidoId = hpa.HistorialProblemaPadreId
                                    )
                                    -- Desplegar ResultSet
                                    insert into @HistoriaResumen
                                    SELECT top 1 @historiaId, HistorialProblemaPadreId, HistoriaProblemaAsistidoId FROM Historial order by HistoriaProblemaAsistidoId desc;


                                    FETCH HistoriasCursor INTO @historiaId
                            END

                            CLOSE HistoriasCursor
                            DEALLOCATE HistoriasCursor 


                            declare @HistorialFinalResumen table  ( HistoriaProblemaAsistidoId int,
								                               HistorialProblemaAsistidoUltimo int,
								                               FechaRegistro datetime,
								                               FechaUltimaAtencion datetime,
								                               EstadoTrabajoId int,
								                               PrioridadCalculada int,
								                               SolicitudAsistenciaId int,
								                               AsignacionTecnicoProblemaId int )


                            insert into @HistorialFinalResumen
                            select 
                                    HistoriaProblemaAsistidoId = hr.HistoriaRaiz,
                                    HistorialProblemaAsistidoUltimo = hr.HistoriaId,
                                    hpaRaiz.FechaRegistro,
                                    FechaUltimaAtencion = hpaUltimo.FechaRegistro,
                                    --ProblemaNombre = dpUltimo.Nombre,
                                    --ProblemaDescripcion = dpUltimo.Descripcion,
                                    --NombreSolicitante = REPLACE(REPLACE(NombreSolicitante,'<<','-'),'>>',''),
                                    etUltimo.EstadoTrabajoId,
                                    --EstadoTrabajo =  etUltimo.Nombre,
                                    hpaUltimo.PrioridadCalculada,
                                    hpaUltimo.SolicitudAsistenciaId,
                                    hpaUltimo.AsignacionTecnicoProblemaId
                                    --hpaRaiz.DescripcionHistoria,
                                    --MotivoCambioEstado = ''
		

                            from @HistoriaResumen hr
                            inner join HD_HistoriaProblemaAsistido hpaRaiz on hpaRaiz.HistoriaProblemaAsistidoId = hr.HistoriaRaiz

                            inner join HD_HistoriaProblemaAsistido hpaUltimo on hpaUltimo.HistoriaProblemaAsistidoId = hr.HistoriaId
                            inner join HD_SolicitudAsistencia saUltimo on saUltimo.SolicitudAsistenciaId = hpaUltimo.SolicitudAsistenciaId
                            inner join HD_DefinicionProblema dpUltimo on dpUltimo.DefinicionProblemaId = saUltimo.DefinicionProblemaId
                            inner join HD_EstadoTrabajo etUltimo on etUltimo.EstadoTrabajoId = hpaUltimo.EstadoTrabajoId

                            where (hpaUltimo.PrioridadCalculada = @Prioridad OR @Prioridad = -1) AND
                                  (etUltimo.EstadoTrabajoId = @EstadoTrabajoId OR @EstadoTrabajoId = -1) AND
                                  saUltimo.NombreSolicitante like @Filtro
      
      
                            /******************* actualizar los estados alta a muy alta de acuerdo a los minutos configurados en @MinutosParaSubirAMuyAlta********************/

                            insert into HD_HistoriaProblemaAsistido(HistorialProblemaPadreId,FechaRegistro,Solucionado,Cerrado, EstadoTrabajoId,SolicitudAsistenciaId,AsignacionTecnicoProblemaId,
										                            PrioridadCalculada,Guid,DescripcionProblema ,DescripcionHistoria)
                            select hfr.HistorialProblemaAsistidoUltimo,GETDATE(),0,0,1,
		                            hfr.SolicitudAsistenciaId,hfr.AsignacionTecnicoProblemaId,
		                            1, NEWID(), 'Cambio automatico a prioridad Muy Alta de acuerdo a configuracion',
		                            'Cambio automatico a prioridad Muy Alta de acuerdo a configuracion'
		
                            from @HistorialFinalResumen hfr where hfr.EstadoTrabajoId = 1 and hfr.PrioridadCalculada = 2 
	                             and CONVERT(VARCHAR(5),DATEADD(mi,@MinutosParaSubirAMuyAlta,HFR.FechaUltimaAtencion),108) LIKE CONVERT(varchar(5),GETDATE(),108)


                            /******************* actualizar los estados media a alta de acuerdo a los minutos configurados en @MinutosParaSubirAlta********************/
                            insert into HD_HistoriaProblemaAsistido(HistorialProblemaPadreId,FechaRegistro,Solucionado,Cerrado, EstadoTrabajoId,SolicitudAsistenciaId,AsignacionTecnicoProblemaId,
										                            PrioridadCalculada,Guid,DescripcionProblema ,DescripcionHistoria)
                            select hfr.HistorialProblemaAsistidoUltimo,GETDATE(),0,0,1,
		                            hfr.SolicitudAsistenciaId,hfr.AsignacionTecnicoProblemaId,
		                            2, NEWID(), 'Cambio automatico a prioridad Alta de acuerdo a configuracion',
		                            'Cambio automatico a prioridad Alta de acuerdo a configuracion'
		
                            from @HistorialFinalResumen hfr where hfr.EstadoTrabajoId = 1 and hfr.PrioridadCalculada = 3 
	                             and CONVERT(VARCHAR(5),DATEADD(mi,@MinutosParaSubirAAlta,HFR.FechaUltimaAtencion),108) LIKE CONVERT(varchar(5),GETDATE(),108)


                            /******************* actualizar los estados baja a media de acuerdo a los minutos configurados en @MinutosParaSubirAMedia********************/
                            insert into HD_HistoriaProblemaAsistido(HistorialProblemaPadreId,FechaRegistro,Solucionado,Cerrado, EstadoTrabajoId,SolicitudAsistenciaId,AsignacionTecnicoProblemaId,
										                            PrioridadCalculada,Guid,DescripcionProblema ,DescripcionHistoria)
                            select hfr.HistorialProblemaAsistidoUltimo,GETDATE(),0,0,1,
		                            hfr.SolicitudAsistenciaId,hfr.AsignacionTecnicoProblemaId,
		                            3, NEWID(), 'Cambio automatico a prioridad Media de acuerdo a configuracion',
		                            'Cambio automatico a prioridad Media de acuerdo a configuracion'
		
                            from @HistorialFinalResumen hfr where hfr.EstadoTrabajoId = 1 and hfr.PrioridadCalculada = 4 
	                             and CONVERT(VARCHAR(5),DATEADD(mi,@MinutosParaSubirAMedia,HFR.FechaUltimaAtencion),108) LIKE CONVERT(varchar(5),GETDATE(),108)


                            select 1 as Result

                             ";
            #endregion

            var query = Session.CreateSQLQuery(sql);
            query.SetInt32("MinutosParaSubirAMuyAlta",MinutosParaSubirAMuyAlta);
            query.SetInt32("MinutosParaSubirAAlta",MinutosParaSubirAAlta);
            query.SetInt32("MinutosParaSubirAMedia", MinutosParaSubirAMedia);

            query.AddScalar("Result", NHibernate.NHibernateUtil.Boolean);

            return query.UniqueResult<bool>();

        }

    }
}
